package com.mdjnu.until;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUntil {
    @Value("${Jwt.secrerKey}")
    private String secrerKey;
    @Value("${Jwt.expiration}")
    private long expiration;

    public String getSecrerKey(String key,String value) {
        // 计算过期时间
        long twoWeeksInMilliseconds = 7 * 24 * 60 * 60 * expiration;
        // 创建JWT对象
        Date expirationDate = new Date(System.currentTimeMillis() + twoWeeksInMilliseconds);
        // 创建JWT头部信息
        HashMap<String, Object> claims = new HashMap<>();
        claims.put("alg", "HS256");
        claims.put("typ", "JWT");
        // 创建JWT对象
        JWTCreator.Builder builder = JWT.create()
                .withHeader(claims) // 添加头部信息
                .withClaim(key,value) // 添加账号
                .withExpiresAt(expirationDate) // 设置过期时间
                .withIssuedAt(new Date()) // 设置签发时间
                .withIssuer("sdApp"); // 可选：设置发行者


        // 使用密钥进行签名，并构建最终的JWT字符串
        String token = builder.sign(Algorithm.HMAC256(secrerKey));
        // 返回生成的JWT字符串
        return token;
    }

    /**
     *  验证JWT
     * @param token
     * @return
     */
    public boolean verify(String token) {
        if (token == null) {
            return false;
        }
        try {
            // 使用Auth0的JWT库构建一个JWTVerifier实例，用于验证JWT
            // 这里假设secretKey是一个已经定义好的密钥，用于HMAC256算法
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secrerKey)).build();

            // 使用验证器验证JWT，如果token无效或被篡改，会抛出JWTVerificationException异常
            DecodedJWT jwt = verifier.verify(token);

            // 检查JWT是否过期，如果过期则返回false
            if (jwt.getExpiresAt().before(new Date())) {
                // 如果JWT过期，记录警告日志并返回false
                return false;
            }

            // 如果JWT有效且未过期，返回true
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    //  获取JWT中的账号
    public static Map<String, Claim> decodeToken(String token) {
        if (token == null || token.isEmpty()) {
            return null;
        }

        try {
            // 解析JWT
            DecodedJWT jwt = JWT.decode(token);

            //  获取JWT中的Claim
            return jwt.getClaims();
        } catch (JWTDecodeException e) {

            return null;
        }
    }
}
